package com.huangpeng.algorithm;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author huangpeng
 * @Title 算法测试类
 * @Package
 * @Date 2021/6/28 15:22
 * @Description
 * @Version 1.0
 */
public class algorithmSimpleTest {
    /**
     * 亮起时间最长的灯
     * **你需要返回一个小写英文字母代表这个编号。`如 'a' 代表 0，'b' 代表 1，'c' 代表 2 ... 'z' 代表 25。`**
     * 所以你的答案应该是`'c'`
     * @author hp
     */
    @org.junit.Test
    public void test1(){
        List<Integer> list1 = new ArrayList<Integer>(){{
            add(0);
            add(2);
        }};
        List<Integer> list2 = new ArrayList<Integer>(){{
            add(1);
            add(5);
        }};
        List<Integer> list3 = new ArrayList<Integer>(){{
            add(0);
            add(9);
        }};
        List<Integer> list4 = new ArrayList<Integer>(){{
            add(2);
            add(15);
        }};
        List<List<Integer>> l = new ArrayList<>();
        l.add(list1);
        l.add(list2);
        l.add(list3);
        l.add(list4);

        //System.out.println(l);
        int maxTime = l.get(0).get(1);
        char answer = (char)('a' + l.get(0).get(0));
        int n = l.size();
        for(int i= 0; i < n - 1; i++){
            List<Integer> next = l.get(i + 1);
            List<Integer> curent = l.get(i);
            int time = next.get(1) - curent.get(1);
            if(time > maxTime){
                maxTime = time;
                answer = (char)(next.get(0) + 'a');
            }
        }
        System.out.println(answer);
    }

    /**
     * 寻找比周围都大的点
     * 给一个n*m大小的矩阵，寻找矩阵中所有比邻居（上下左右，对角也算，不考虑边界，即8个）都严格大的点。
     * 返回一个n*m大小的矩阵，如果原矩阵中的点比邻居都严格大，则该位置为1，反之为0。
     * @author hp
     */
    @org.junit.Test
    public void test2(){
        int[][] DIRECTIONS = {{0, 1},{1, 0},{0, -1},{-1, 0},{1, 1},{1, -1},{-1, 1},{-1, -1}};
        int[][] grid = {{1,2,3,4},{5,5,5,2},{1,1,1,1},{0,0,0,9}};
        int d = DIRECTIONS.length;
        int n = grid.length;
        int m = grid[0].length;
        int[][] resultMatrix = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                boolean isLargestNumber = true;
                for (int k = 0; k < d; k++) {
                    int neighborI = i + DIRECTIONS[k][0];
                    int neighborJ = j + DIRECTIONS[k][1];
                    if(!isValid(neighborI,neighborJ,grid)){
                        continue;
                    }
                    if(grid[i][j] <= grid[neighborI][neighborJ]){
                        isLargestNumber = false;
                    }
                    if(isLargestNumber){
                        resultMatrix[i][j] = 1;
                    }else{
                        resultMatrix[i][j] = 0;
                    }
                }
            }
        }
        int L = resultMatrix.length;
        for (int i = 0,j = 0; i < L;){
            System.out.println(resultMatrix[i][j]);
            j ++;
            if(j >= resultMatrix[i].length){
                i ++;
                j = 0;
            }
        }
    }
    /**
     * 判断是否越界
     */
    private boolean isValid(int x, int y, int[][] grid) {
        if (x < 0 || x >= grid.length) {
            return false;
        }
        if (y < 0 || y >= grid[0].length) {
            return false;
        }
        return true;
    }

    /**
     * 给出两个字符串 str 和 sub，你的任务是在 str 中完全删除那些在 sub 中存在的字符。
     * @author hp
     */
    @org.junit.Test
    public void test3(){
        String str = "They are students";
        String sub = "aeiou";
        int[] temp = new int[256];
        for (int i = 0; i < sub.length(); i++) {
            temp[sub.charAt(i)] ++;
        }
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < str.length(); i++) {
            if(temp[str.charAt(i)] == 0){
                stringBuffer.append(Character.toString(str.charAt(i)));
            }
        }
        System.out.println(stringBuffer.toString());
    }

    /**
     * 给您一个字符串形式的C ++文件（每行是一个字符串），我们希望您在注释行中找到“ Google”。如果注释行中有“ Google”，则返回true，否则返回false。
     * C++有两种注释方式，一种是单行注释 //，代表着//后面的本行内容均为注释，另一种是多行注释，
     * 这两者之间的部分均为注释。
     * @author hp
     */
    @org.junit.Test
    public void test4(){
        List<String> str = new ArrayList<String>(){{
            add("#include<bits/stdc++.h>,using namespace std;,//Google test,int main(){,return 0;,}");
        }};
        boolean flag;//是否有Google字符标记
        boolean comment = false;//跨行注释
        boolean Comment = false;//行内注释
        for(String s : str){
            for (int i = 0; i < s.length() - 1; i++) {
                if(s.substring(i,i+2).equals("//")){
                    Comment = true;
                }
                if(s.substring(i,i+2).equals("/*")){
                    comment = true;
                }
                if(s.substring(i,i+2).equals("*/")){
                    comment = false;
                }
                if(i+5 < s.length() && s.substring(i,i+6).equals("Google") && (comment | Comment)){
                    flag = true;
                }
            }
            Comment = true;
        }
        flag = false;
        System.out.println(flag);

    }

    /**
     * 有偶数个数相同，需要找出不同的那个数时，比如：2，3，4，4，3，5，5，6，6，7，7
     * @author hp
     */
    @org.junit.Test
    public void test5(){
    }

    /**
     * 将一个链表转换为一个数组。
     * @author hp
     */
    @org.junit.Test
    public void test6(){
    }

    /**
     * 给出两个整数 aa 和 bb , 求他们的和并以整数（int）的形式返回。
     * @author hp
     */
    @org.junit.Test
    public void test7(){
    }
}
